﻿using System;  
using System.Collections.Generic;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using ADV_Evaluator;
using ADV_Evaluator.Data;
using ADV_Evaluator.Command;


namespace ADV_Editor.CommandDialog {

    /// <summary>
    /// 表示する画像を選択する
    /// </summary>
    partial class BgImageDialog : CommandDialogBase {

        /// <summary>
        /// 初期値を指定しないコンストラクタ
        /// </summary>
        public BgImageDialog() {
            // コンポーネントの初期化
            InitializeComponent();
            // 画像/背景 フォルダ下にあるすべての画像をListBoxに表示する
            foreach (string str in Directory.GetFiles("画像/背景")) {
                string filename = Path.GetFileName(str);
                string ext = Path.GetExtension(str).ToLower();
                foreach (string _ext in Const.ImageExtensions) {
                    if (ext == _ext) {
                        listBox.Items.Add(filename);
                        break;
                    }
                }
            }
            // 最初の要素を選択しておく
            listBox.SelectedIndex = 0;

            rabBack.Checked = true;
        }

        /// <summary>
        /// 初期値を指定したコンストラクタ
        /// </summary>
        /// <param name="param">属性</param>
        public BgImageDialog(BgImageParams param) : this(){
            // 画像セット
            if (param.FileName.Length > 0) {
                listBox.SelectedItem = param.FileName;
                ShowImage(param.FileName);
            }
            numericUpDown_Duration.Value = param.Duration;
            if (param.Z.Equals(0)) { rabBack.Checked = true; }
            if (param.Z.Equals(1)) { rabFront.Checked = true; }
        }

        /// <summary>
        /// リストボックスの選択項目が変化したとき
        /// </summary>
        private void listBox_SelectedIndexChanged(object sender, EventArgs e) {
            string filename = listBox.SelectedItem as string;
            // (None)なら画像を消去
            if (filename == "(None)") {
                if (pictureBox.Image != null) {
                    pictureBox.Image.Dispose();
                    pictureBox.Image = null;
                }
            } else {
                // ピクチャボックスに画像を表示する
                ShowImage(filename);
            }
        }

        /// <summary>
        /// 指定したファイル名の画像をピクチャボックスに表示する
        /// </summary>
        /// <param name="filename">表示するファイル名</param>
        private void ShowImage(string filename) {
            if (pictureBox.Image != null) {
                pictureBox.Image.Dispose();
            }
            pictureBox.Image = Image.FromFile("画像/背景/" + filename);
        }

        /// <summary>
        /// 設定された画像をコマンド化したもの
        /// </summary>
        public override CommandListData Command {
            get {
                string filename = listBox.SelectedItem as string;
                // Noneならファイル名を空文字列にしておく
                if (filename == null || filename == "(None)") {
                    filename = "";
                }
                // 属性
                BgImageParams param;
                param.FileName = filename;
                param.Duration = (int)numericUpDown_Duration.Value;
                if (rabBack.Checked) { param.Z = 0; }
                else { param.Z = 1; }
                if (filename.Length == 0)
                {
                    return new CommandListData(CommandName.背景画像の消去, param);
                } else {
                    return new CommandListData(CommandName.背景画像の表示, param);
                }
            }
        }

        #region ヘルプ
        /// <summary>
        /// OKボタンのヘルプ
        /// </summary>
        private void button_OK_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "このダイアログを閉じて、コマンドを追加します。");
        }
        /// <summary>
        /// キャンセルボタンのヘルプ
        /// </summary>
        private void button_Cancel_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "変更内容を保存せずにこのダイアログを閉じます。");
        }
        /// <summary>
        /// 画像選択のヘルプ
        /// </summary>
        private void listBox_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "表示させる画像を選択します。\n(None)を指定すると、背景を消去します。");
        }
        /// <summary>
        /// プレビューのヘルプ
        /// </summary>
        private void pictureBox_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "画像の選択 で指定した画像のプレビューです。\nゲーム中では、画面サイズに合わせて伸縮して表示されます。");
        }
        /// <summary>
        /// フレーム数指定のヘルプ
        /// </summary>
        private void groupBox_Duration_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "1以上の値を指定すると、表示、若しくは消去するときに、ゆっくりと透明度が変わっていくエフェクトをかけることが出来ます。");
        }
        #endregion

    }
}